var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');//引入处理根目录请求的路由
var usersRouter = require('./routes/users');//引入处理uses目录请求的路由
var vip = require('./routes/vip.js');
var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));//设置模版的默认目录
app.set('view engine', 'ejs');//设置模版引擎是ejs模版
/**
 * 中间件：
 * 1）什么是中间件？
 * 中间件就是一个函数，位于客户端与路由之间，可以访问请求对象和响应对象，也可以调起下一个中间件。
 * //console.log(typeof logger('dev'));
 * express框架就是一个由中间件架构起来的框架，整个框架全是中间件
 * 2）自定义中间件
 * app.use(function(req,res,next){
 *    res.send('我是中间件');
 * });
 * 3）尾函数next
 * 如果在中间件不调用next函数，整个请求响应流程就终止不会再往后面执行
 * 调用尾函数相当于调用下一个中间件，执行完以后自己的函数继续执行
 * 4)静态文件必须放在，路由前面执行，这样可以优先显示静态文件
 *app.use(express.static(path.join(__dirname, 'public')));//设置静态文件目录,静态页面优先展示
 * 
 */
// next尾函数，默认不往下进行
// app.use(function (req, res, next) {
//   // console.log('我是中间件');
//   res.send('我是中间件');
// });
/*app.use(function (req, res, next) {
  console.log('111');
  next();
  console.log('222');
  // next();//调用尾函数，放行继续往下执行。
});
app.use(function (req, res, next) {
  console.log('333');
  next();
  console.log('444');
});*/
// app.use(function (req, res, next) {
//   console.log('555');
// });
/*需求：写一个记录网站访问日志是中间件*/
app.use(function(req,res,next){
  var fs=require('fs');
  var ip=req.ip;
  var time=new Date().toLocaleString();
  var data=fs.readFileSync('./2019-07-21.log');
  data+='访问时间：'+time+' IP:'+ip+'\n';
  fs.writeFileSync('./2019-07-21.log',data);
  next();
});
app.use(logger('dev'));
// console.log(typeof logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));//设置静态文件目录,静态页面优先展示

app.use('/', indexRouter);//分配根目录下的请求给index去处理
app.use('/users', usersRouter);//分配users目录下的请求给users模块去处理
app.use('/vip', vip);
// catch 404 and forward to error handler
app.use(function (req, res, next) {
  next(createError(404));
});

// error handler
app.use(function (err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;
